import json
import requests
from Interface.litemall_po2.utils.log_utils import logger


class BaseApi:
    def __init__(self, base_url,role=None):
        self.base_url = base_url
        # 获取对应的角色
        if role:
            self.role = role

    def __set_token(self, request_infos):
        """
        # 问题：除登录接口之外，基本上每一个接口，都需要另外设置token
        # 解决方法：
            1. 在发起接口请求之前，就获取token信息
            2. 获取token信息之后，塞入到请求信息之中
            -> 除method 和 url 之外，所有的其他信息，包括header params 等等其他参数，都会塞入之kwargs 不定长参数中
            cart_api -> send -> 获取kwargs -> 在kwargs中塞入header(鉴权)信息
        :return:
        """
        admin_url = "admin/auth/login"
        admin_data = {"username": "admin123", "password": "admin123", "code": ""}
        admin_r = requests.request("post", self.base_url + admin_url, json=admin_data)
        self.token = {"X-Litemall-Admin-Token":admin_r.json()["data"]["token"]}

        client_url = "wx/auth/login"
        client_data = {"username": "user123", "password": "user123"}
        client_r = requests.request("post", self.base_url + client_url, json=client_data)
        self.client_token = {"X-Litemall-Token":client_r.json()["data"]["token"]}
        # 如果是admin，那么就塞入admin的token
        # 如果是其他，那么就塞入其他的token
        if self.role == "admin":
            self.final_token = self.token
        else:
            self.final_token = self.client_token

        # 获取headers, 如果请求本身有头信息，那么就把token信息更新进去
        if request_infos.get("headers"):
            request_infos["headers"].update(self.final_token)
        else:
            request_infos["headers"] = self.final_token

        return request_infos

    def send(self, method, url, **kwargs):
        # 问题1：接口里面直接使用requests
        # 解决方法：在base_api 中添加公共的send方法
        # 问题2：大量重复的base_url
        # 解决方案：在构造函数，实例化base_url，并且在send方法里拼接，无需重复编写self.base_url
        # 问题3：token 的获取也放到了构造函数里面
        # 解决方案：在构造函数，实例化base_url，并且在send方法里拼接，无需重复编写self.base_url

        kwargs = self.__set_token(kwargs)
        r = requests.request(method, self.base_url + url, **kwargs)
        logger.debug(f"{url}接口的响应为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        return r.json()


